home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / filutil / dfmake.zip / LIB / DFLIB.C next >
C/C++ Source or Header  |  1994-07-30  |  5KB  |  169 lines

  1.  
  2. #include "pmc.h"
  3. #include "dflib.h"
  4.  
  5. /****************************************************************************
  6. *   df_open
  7. *
  8. *       open a DATAFILE lib
  9. *
  10. *   In:     filename    =   datafile file name
  11. *
  12. *   Out:    file handle if datafile
  13. *           NULL if error
  14. *
  15. ****************************************************************************/
  16.  
  17. WORD __cdecl df_open(STR filename)
  18. {
  19.     DWORD   file,temp;
  20.  
  21.     if(hiWORD(file=fileopen(filename,RDWR))!=NULL) return(NULL);
  22.     filelseek(loWORD(file),DF_SIGN_OFF,SEEK_END);
  23.     fileread(loWORD(file),&temp,DF_SIGN_SIZE);
  24.     if(temp!=DF_SIGN) {             // check if a real datafile
  25.         fileclose(loWORD(file));
  26.         return(NULL);
  27.     }
  28.     return(loWORD(file));
  29. }
  30.  
  31. /****************************************************************************
  32. *   df_close
  33. *
  34. *       close a DATAFILE lib
  35. *
  36. *   In:     df_handle   =   datafile file handle
  37. *
  38. ****************************************************************************/
  39.  
  40. void __cdecl df_close(WORD df_handle)
  41. {
  42.     fileclose(df_handle);
  43. }
  44.  
  45. /****************************************************************************
  46. *   df_getinfos
  47. *
  48. *       get infos of a DATAFILE lib
  49. *
  50. *   In:     df_handle   =   datafile file handle
  51. *
  52. *   Out:    pointer to datafile infos if datafile
  53. *           NULL if error
  54. *
  55. ****************************************************************************/
  56.  
  57. DATAFILE * __cdecl df_getinfos(WORD df_handle)
  58. {
  59.     DWORD   temp;
  60.     WORD    file,nfiles;
  61.     DATAFILE    *datafileinfo,*dftemp1,*dftemp2;
  62.     DWORD   nbuf;
  63.  
  64.     filelseek(df_handle,DF_SIGN_OFF,SEEK_END);  // is a datafile lib ?
  65.     fileread(df_handle,&temp,DF_SIGN_SIZE);
  66.     if(temp==DF_SIGN) {
  67.  
  68.         filelseek(df_handle,DF_OFFSET_OFF,SEEK_END); // get header offset
  69.         fileread(df_handle,&temp,DF_OFFSET_SIZE);
  70.  
  71.         filelseek(df_handle,-temp,SEEK_END);         // get num of files
  72.         fileread(df_handle,&nfiles,DF_NFILES_SIZE);
  73.  
  74.         if(nfiles) {                             // allocate mem for dfinfo
  75.             if(!(datafileinfo=(DATAFILE *)malloc(sizeof(DATAFILE)))) return(NULL);
  76.         } else {
  77.             return(NULL);
  78.         }
  79.  
  80.         fileread(df_handle,datafileinfo->name,DF_NAME_S); // get 1st dfinfo
  81.         fileread(df_handle,&nbuf,DF_OFFSET_S); // get 1st dfinfo
  82.         datafileinfo->offset=nbuf;
  83.         fileread(df_handle,&nbuf,DF_LENGTH_S); // get 1st dfinfo
  84.         datafileinfo->length=nbuf;
  85.  
  86.         datafileinfo->next=NULL;
  87.         nfiles--;
  88.         dftemp1=datafileinfo;
  89.  
  90.         while(nfiles) {                           // while files
  91.             if(!(dftemp2=(DATAFILE *)malloc(sizeof(DATAFILE)))) {
  92.                 df_delinfos(datafileinfo);          // no memory, del all
  93.                 return(NULL);
  94.             }
  95.  
  96.             fileread(df_handle,dftemp2->name,DF_NAME_S); // get 1st dfinfo
  97.             fileread(df_handle,&nbuf,DF_OFFSET_S); // get 1st dfinfo
  98.             dftemp2->offset=nbuf;
  99.             fileread(df_handle,&nbuf,DF_LENGTH_S); // get 1st dfinfo
  100.             dftemp2->length=nbuf;
  101.  
  102.             dftemp1->next=dftemp2;                  // link prev with this
  103.             dftemp1=dftemp2;
  104.             dftemp1->next=NULL;
  105.             nfiles--;
  106.         }
  107.         return(datafileinfo);
  108.     }
  109.     return(NULL);
  110. }
  111.  
  112. /****************************************************************************
  113. *   df_delinfos
  114. *
  115. *       delete DATAFILE infos data from mem
  116. *
  117. *   In:     datafileinfo    =   pointer to datafile infos
  118. *
  119. ****************************************************************************/
  120.  
  121. void __cdecl df_delinfos(DATAFILE *datafileinfo)
  122. {
  123.     DATAFILE *dftemp=NULL;
  124.  
  125.     while(datafileinfo) {
  126.         dftemp=datafileinfo->next;
  127.         free(datafileinfo);
  128.         datafileinfo=dftemp;
  129.     }
  130. }
  131.  
  132. /****************************************************************************
  133. *   df_read
  134. *
  135. *       read a file of a DATAFILE lib in memory
  136. *
  137. *   In:     df_handle   =   datafile file handle
  138. *           datafileinfo=   pointer to a datafile info struct
  139. *           name        =   name of file in lib
  140. *           buffer      =   pointer of a supplied ram buffer
  141. *                           NULL ,memory allocated by df_read
  142. *
  143. *   Out:    pointer to a mem buffer
  144. *           NULL if error
  145. *
  146. ****************************************************************************/
  147.  
  148. PTR __cdecl df_read(WORD df_handle,DATAFILE *datafileinfo,STR name,PTR buffer)
  149. {
  150.     PTR     tbuffer;
  151.  
  152.     tbuffer=buffer;
  153.  
  154.     while(datafileinfo!=NULL) { // search the name in dfinfo
  155.         if(!(strncmp(name,datafileinfo->name,strlen(name)))) {
  156.             if (!tbuffer)   // allocate memory if needed
  157.                 if(!(tbuffer=(PTR)malloc(datafileinfo->length))) {
  158.                     return(NULL);
  159.                 }
  160.             filelseek(df_handle,-(datafileinfo->offset),SEEK_END); // set pos
  161.             fileread(df_handle,tbuffer,datafileinfo->length); // read in mem
  162.             return(tbuffer);
  163.         }
  164.         datafileinfo=datafileinfo->next;
  165.     }
  166.     return(NULL);
  167. }
  168.  
  169.